home *** CD-ROM | disk | FTP | other *** search
/ CD ROM Paradise Collection 4 / CD ROM Paradise Collection 4 1995 Nov.iso / program / swagg_m.zip / INTERRUP.SWG / 0017_Disabling The Ctrl-Alt-D.pas < prev    next >
Pascal/Delphi Source File  |  1994-02-09  |  6KB  |  163 lines

  1.  
  2. unit NonStop;                         {Makes your program UNSTOPPABLE!}
  3.  
  4. interface
  5.  
  6.  var
  7.    Intr09 : pointer absolute $0000:$0024; {Interrupt $09, keyboard ISR}
  8.    OldIntr09 : pointer;                   {Original Interrupt $09     }
  9.  
  10. const
  11.    NoBoot  : boolean = true;              {flag to disable soft boot  }
  12.    NoBreak : boolean = true;              {flag to disable Ctrl-Break }
  13.    NoCtrlC : boolean = true;              {flag to disable Ctrl-C     }
  14.  
  15.  procedure InstallNonStopISR;
  16.  procedure NonStopExitProc;
  17.  
  18. implementation
  19.  
  20.  var
  21.    PreNonStopExitProc : pointer;
  22.  
  23.  const
  24.    Installed : boolean = false;
  25.  
  26.  procedure NonStopISR; External; {$L NonStop}
  27.  
  28.  procedure InstallNonStopISR;
  29.  
  30.  begin
  31.   if not Installed then
  32.   begin
  33.    OldIntr09 := Intr09;
  34.    inline($fa);                       {CLI - disable interrupts         }
  35.    Intr09 := @NonStopISR;              {Link NonStop into interrupt chain}
  36.    inline($fb);                       {STI - enable interrupts          }
  37.    PreNonStopExitProc := ExitProc;    {Save old ExitProc                }
  38.    ExitProc := @NonStopExitProc;      {Link in NonStopExitProc          }
  39.    Installed := true;
  40.   end;
  41.  end;
  42.  
  43.  procedure NonStopExitProc;
  44.  
  45.  begin
  46.   ExitProc := PreNonStopExitProc;      {Point ExitProc to next  }
  47.   inline($fa);                         {CLI - disable interrupts}
  48.   Intr09 := OldIntr09;                 {Restore Original Vector }
  49.   inline($fb);                         {STI - enable interrupts }
  50.  end;
  51.  
  52. end.
  53.  
  54. *XX3402-000419-090294--72--85-43138-----NONSTOP.OBJ--1-OF--1
  55. U+o+0qtjPbBoPr+iEJBBG6UU++++53FpQa7j623nQqJhMalZQW+UJaJmQqZjPW+n9X8NW-A+
  56. ECblGoYQ0qtjPbBoPr+iEJBBQ6U1+21dH7M0++-cW+A+E84IZUM+-2F-J234a+Q+G++++U2-
  57. 3NM4++F1HoF3FNU5+0WW++A-+N8A7U+4HYx0HoxI++RCHo7GFI39++RCHoBIIYl1++ZDH2F7
  58. HZFGA1Y+l7+F+++00YtDHZBIHp-7Ip6++++oW+E+E86-YO0V++6++-tEi+++XhUilUOR+CeE
  59. znM0+Dwq+++iXkOS+0uD-e++Aw0CqDwq7+-M-HA+I6w47+-M5ls4I9V++6v+i+++XhUaWWML
  60. +61Y-61A+5FAt4+mt+ca++-o2mO87VQ+UCE6UAk+R+MwIrI0ulcmt+ca++-o-XnURE9f119Y
  61. 0WM++5END0tp3SFVWi+AUCNVVi1aDTek6CMUK+QTnzhM-lw6b0s+l+dI+gENJ+925ZE0m+BI
  62. +QEE-U22l-E4+EH6D3E-l3A4+E52PUM-+gFw-U21m6c5+A2++U6++8c+
  63. ***** END OF BLOCK 1 *****
  64.  
  65.  
  66. { ------------------------   ASSEMBLER MODULE  --------------------- }
  67. ;ASM NONSTOP.PAS
  68.  
  69. DATA    SEGMENT WORD PUBLIC
  70.         ASSUME DS:DATA
  71. EXTRN   NoBoot    : BYTE
  72. EXTRN   NoBreak   : BYTE
  73. EXTRN   NoCtrlC   : BYTE
  74. EXTRN   OldIntr09 : DWORD
  75. DATA    ENDS
  76.  
  77. CODE    SEGMENT BYTE PUBLIC
  78.         ASSUME CS:CODE
  79.  
  80. NonStopISR PROC FAR
  81.            PUBLIC NonStopISR
  82.  
  83.         push    ds                     ;This is the initialization code
  84.         push    ax                     ;It will be used only once
  85.         mov     ax, seg DATA           ;To fix up the far jump
  86.         mov     ds, ax                 ;put Global Data Segment in DS
  87.         mov     cs:[JmpCode], 0eah     ;install far jump op code
  88.         push    [OldIntr09]            ;put pointer to old interrupt 09
  89.         pop     cs:Offs                ;in far jump offset
  90.         pop     cs:Segm                ;in far jump segment
  91.         xor     ax,ax                  ;point DS to interrupt vector table
  92.         mov     ds,ax                  ;ie, ds=0
  93.         push    ds:[24h]               ;Put offset of Int 09
  94.         pop     ax                     ;in ax
  95.         add     ax, Entry - NonStopISR ;Adjust past init code
  96.         push    ax
  97.         pop     ds:[24h]               ;revector to regular entry point
  98.         pop     ax
  99.         pop     ds
  100. Entry:
  101.         push    ds
  102.         push    es
  103.         push    ax
  104.         mov     ax, 40h                ;point es
  105.         mov     es, ax                 ;to BIOS data area
  106.         mov     ax, seg DATA           ;point ds
  107.         mov     ds, ax                 ;to data segment
  108.         mov     ah, es:[17h]           ;put keyboard shift flags in ax
  109.         and     ah, 00000100b          ;mask out everything but ctrl flag
  110.         or      ah, 00000000b          ;see if zero
  111.         jz      NormalKey              ;chain on if ctrl not pressed
  112.         in      al, 60h                ;get make/break code
  113.         xor     ah, ah                 ;zero ah
  114.         or      ah, NoBoot             ;Is flag set to disable soft boot?
  115.         jz      CheckBreak             ;No? Go check for break
  116.         mov     ah, es:[17h]           ;get keyboard shift flags
  117.         and     ah, 00001000b          ;mask out all but alt flag
  118.         or      ah, 00000000b          ;is result zero?
  119.         jz      CheckBreak             ;go on to check for break
  120.         cmp     al, 53h                ;is it del make?
  121.         jnz     CheckBreak             ;no, chain on to old int 09
  122.         jmp short TossIt               ;Soft boot attempted - no dice!
  123. CheckBreak:
  124.         xor     ah, ah                 ;zero ah
  125.         or      ah, NoBreak            ;Flag set to disable ctrl-break?
  126.         jz      CheckCtrlC             ;No? Go check for Ctrl-C
  127.         cmp     al, 0E0h               ;is it Break make?
  128.         jnz     CheckCtrlC             ;No? Go check for Ctrl-C
  129.         jmp short TossIt               ;Ctrl-Break attempted - toss it!
  130. CheckCtrlC:
  131.         xor     ah, ah                 ;zero ah
  132.         or      ah, NoCtrlC            ;flag set to disabe ctrl-c?
  133.         jz      NormalKey              ;No? Chain on to old ISR
  134.         cmp     al, 2Eh                ;C pressed?
  135.         jnz     NormalKey              ;No? Chain on to old ISR
  136. TossIt:
  137.         in      al, 61h                ;read keyboard control port
  138.         mov     ah, al
  139.         or      al, 10000000b          ;set the "reset" bit
  140.         out     61h, al                ;send it back to control
  141.         xchg    ah, al                 ;get back control value
  142.         out     61, al                 ;send it out also
  143.         cli
  144.         mov     al, 20h                ;send EOI to the
  145.         out     20h, al                ;interrupt controller
  146.         pop     ax;
  147.         pop     es;
  148.         pop     ds;
  149.         iret                           ;LATER, DUDE!
  150. NormalKey:
  151.         sti                            ;allow interrupts
  152.         pop     ax                     ;cleanup and
  153.         pop     es
  154.         pop     ds
  155. JmpCode db      ?                      ;Far jump to old Int 09
  156. Offs    dw      ?
  157. Segm    dw      ?
  158.  
  159. NonStopISR  ENDP
  160. CODE    ENDS
  161.         END     NonStopISR
  162.  
  163.